www.gusucode.com > php框架系统:MDPHP麦迪源码 v1.xPHP源码程序 > php框架系统:MDPHP麦迪源码 v1.x/mdphp_v1.0.beta/mdphp_v1.0.beta/Library/Practic.php
<?php /** * 获取用户输入数据 * @param string $id 获取方式: 类型.名称 * @param [type] $default默认值 * @param [type] $filter 用作处理的方法 * @return string 用户数据 */ function I($id, $default=null, $filter='htmlspecialchars'){ $name = array( 'G' => '_GET', 'P' => '_POST', 'S' => '_SERVER', 'R' => '_REQUEST', 'T' => '_TMPLVAR', ); $id = trim($id, '.'); if(isset($name[strtoupper($id)])){ $id = $name[strtoupper($id)]; //整个数组 }else{ $type = strtoupper(substr($id, 0, 2)); if(substr($type, -1)=='.' && strlen($id)>2 && isset($name[rtrim($type, '.')])){ $id = $name[rtrim($type, '.')] . substr($id, 1); //指定 }else{ //内部获取 $key = strtoupper(substr($id, 0, 6)); $array = array('COOKIE'=>6, 'SESSIO'=>7); if($bool=array_key_exists($key, $array)) $id = '_' . strtoupper(substr($id, 0, $array[$key])) . substr($id, $array[$key]); else $id = (isset($_REQUEST[$id]) ? '_REQUEST.' : 'GLOBALS.') . $id; } } if($id === '') return; $name = MDPHP\Custom::parseVar($id); //内部 cookie session 方法调用 if(!empty($bool) && func_num_args()==2){ if($default===null) eval('unset(' . $name . ');'); else eval($name . ' = $default;'); return; } if(substr($id, 0, 8) == '_TMPLVAR') $_TMPLVAR = (array)$GLOBALS['MDPHP']; return MDPHP\Custom::runMagicQuotes(eval('return isset(' . $name . ') ? ' . $name . ' : $default;'), $filter); } /** * 生成URL地址 * @param string $url 动作 或 控制器/动作 * @param array $param 传递参数 * @return string URL地址 */ function U($url, $args=null){ //变量初始 if($url{0}=='#' && !method_exists(MD_PREFIX_CTR.MD_CTR, $url)) $url = array('path' => '_' . MD_ACT . (($sub=substr($url, 1)) ? '_' : '') . $sub); else $url = parse_url($url); $param = C('URL.PARAM') && $args; //参数解析 parse_str((isset($url['query']) ? $url['query'] : ''), $url['query']); if(is_string($args)) parse_str($args, $args); $url['query'] = array_merge($url['query'], (array)$args); //锚点解析 $url['fragment'] = isset($url['fragment']) ? $url['fragment'] : null; //控制器、动作解析 $array = explode('/', $url['path']); $default = arrayCallBack(C('DEFAULT'), function($v){ return strtolower($v); }); switch(count($array)){ case 1: $url['path'] = MD_MOD . '/' . MD_CTR . '/' . $array[0]; break; case 2: $url['path'] = MD_MOD . '/' . $array[0] . '/' . $array[1]; break; case 3: $url['path'] = $array[0] . '/' . $array[1] . '/' . $array[2]; break; } $array = explode('/', $url['path']); //简化地址 if(!$param){ if(strtolower($array[0]) == $default['MODULE']) $array[0] = null; if(!$array[0] && strtolower($array[1])==$default['CONTROLLER']) $array[1] = null; if(!$array[0] && !$array[1] && strtolower($array[2])==$default['ACTION']) $array[2] = null; } $url['path'] = ($array[0] ? $array[0].'/' : '') . ($array[1] ? $array[1].'/' : '') . ($array[2] ? $array[2] : ''); $url['path'] = $url['path'] . ((!$url['path'] || substr($url['path'], -1)=='/') ? '' : C('TMPL_SUFFIX')); //拼接URL array_walk($url['query'], function(&$v, $k, $e){ $v = $k . $e . $v; }, ($param ? '/' : '=')); $url['query'] = (empty($url['query']) ? '' : (($param ? '' : '?').implode(($param ? '/' : '&'), $url['query']))); if(($url['path']||$url['query']) && ($param||!C('URL.PSEUDO'))){ $url['path'] = getRootPath() . getFileName($_SERVER['SCRIPT_NAME']) . ($url['path'] ? '/' : '') . $url['path']; }else{ $url['path'] = getRootPath() . ltrim($url['path'], '/'); } $url = $url['path'] . ($param&&$url['query'] ? '/' : '') . $url['query'] . (is_null($url['fragment']) ? '' : '#'.$url['fragment']); //返回结果 return $url; } /** * 读取配置项 * @param string $name 配置项名称 * @param [type] $value (可空)修改为的值 * @param string $module 模块名称, 用于跨模块配置项获取 */ function C($name=null, $value=null, $module=null){ static $_config = array(); if(is_array($name)){ $_config = array_merge($_config, $name); return; } if(!is_null($module)){ if(file_exists($file=MD_PATH.ucfirst($module).'/config.php')) $config = include $file; else $config = array(); }else{ $config =& $_config; } $name = MDPHP\Custom::parseVar('config' . (is_null($name) ? '' : '.'.$name)); if(func_num_args() == 2) return eval('return ' . $name . ' = $value;'); else return eval('return isset(' . $name . ') ? ' . $name . ' : null;'); } /** * 写文件 * @param string $name 为'config/config-root(总)' 修改配置文件, 默认为'auto' 自动生成 * @param [type] $data 支持任何类型(删除文件填null) * @return boolean/string 返回 布尔值 或 文件名(未指定文件名时) */ function F($name='auto', $data=array()){ $type = strtolower($name); switch(strtolower($name)){ case 'auto': $name = MD_PATH_CACHE . getRandName('.php'); break; case 'config': $name = MD_PATH_COMPLETE . 'config.php'; break; case 'config-root': $name = MD_PATH . 'config.php'; $type='config'; break; } if(func_num_args() == 1){ //读取 return ($type=='config' ? (include $name) : unserialize(substr(file_get_contents($name), 13))); }else{ if(is_null($data)){ //删除 return ($type=='config' ? (bool)file_put_contents($name, '<?php return array(); ?>') : @unlink($name)); }else{ //设置 if($type == 'config') $data = '<?php return ' . var_export(array_merge((array)include $name, (array)$data), true) . '; ?>'; else $data = '<?php die; ?>' . serialize($data); return (bool)file_put_contents($name, $data); } } } /** * 实例化一个模型 * @param string $name 模型名称 * @return 实例化模型 */ function M($name=null){ return new MDPHP\Model($name, C('DB_CONFIG')); } /** * 缓存功能 * @param string $name 缓存名称 * @param [type] $data 数据 * @param integer $expire 有效期(秒) * @return 缓存数据 */ function S($name, $data=null, $expire=0){ $name = MD_PATH_CACHE . md5('MD_'.base64_encode($name)) . '.php'; if(func_num_args() == 1){ //读取 $data = F($name); $time = substr($data, 0, ($int = strpos($data, '$$$'))); if($time<1 || $time>time()){ MDPHP\Custom::log(1, 'C'); return unserialize(substr($data, $int+3)); }else{ MDPHP\Custom::log(2, 'C'); F($name, null); return null; } }else{ if(is_null($data)){ return F($name, null); //删除 }else{ MDPHP\Custom::log(0, 'C'); return F($name, ($expire ? time()+$expire : '') . '$$$' . serialize($data)); //设置 } } } /** * 执行插件 * @param string $name 名称 * @param array $param 事件 * @param array $event 参数 * @return [type] 返回值 * * exec('name') * exec('name', array(1, 2)) * exec('name', 'a') * exec('name', 'a', array(1, 2)) * */ function P($name, $event='run', &$param=array()){ return Plugin::exec($name, $event, $param); } /** * 数据统计 * @param string $name 名称 * @param integer $step 步进值 * @return integer */ function N($name, $step=null){ static $_number = array(); if(is_null($step)) return isset($_number[$name]) ? $_number[$name] : null; else return isset($_number[$name]) ? $_number[$name]+=$step : $_number[$name]=$step; } /** * 钩子监听 * @param string $event 事件名 * @param array &$param 参数 */ function hook($event, &$param=array()){ Plugin::listen($event, $param); } /** * cookie操作 * @param string $name 名称 * @param string $value 值 * @param array $option 配置项 * @return [type] 处理结果 */ function cookie($name='', $value=null, $option=array()){ $option = array_merge(array( 'prefix' => C('COOKIE.PREFIX'), 'expire' => C('COOKIE.EXPIRE'), 'path' => C('COOKIE.PATH'), 'domain' => C('COOKIE.DOMAIN'), 'secure' => C('COOKIE.SECURE'), 'httponly' => C('COOKIE.HTTPONLY') ), (array)$option); if(func_num_args() <= 1){ if($name === null){ //全部删除 $time = time() - 3600; foreach(MDPHP\Custom::parseCookie() as $key => $value){ setcookie($key, null, $time, $option['path'], $option['domain'], $option['secure'], $option['httponly']); } $_COOKIE = array(); }elseif($name === ''){ //全部获取 return I('COOKIE'); }else{ //获取指定 return I('COOKIE.' . $option['prefix'] . $name); } }else{ if(is_array($value)){ //配置 $option = array_merge($option, $value); }elseif($value === null){ //删除指定 setcookie($option['prefix'].$name, null, time()-3600, $option['path'], $option['domain'], $option['secure'], $option['httponly']); I('COOKIE.'.$option['prefix'].$name, null); }else{ //设置 setcookie($option['prefix'].$name, $value, time()+$option['expire'], $option['path'], $option['domain'], $option['secure'], $option['httponly']); I('COOKIE.'.$option['prefix'].$name, $value); } } } /** * session操作 * @param string $name 名称 * @param [type] $value 值 * @return [type] 处理结果 */ function session($name='', $value=''){ C('SESSION.START', true) || session_start(); if($name === null){ //全部删除 $_SESSION = array(); }elseif($name === ''){ //全部获取 return I('SESSION'); }elseif($value === null){ //删除指定 I('SESSION.' . $name, null); }elseif($value === ''){ //获取指定 return I('SESSION.' . $name); }else{ //设置 I('SESSION.' . $name, $value); } } /** * 生成表单Hash值 * @return string */ function hash_get($id=0){ $hash = substr(md5(base64_encode(uniqid().mt_rand(0, 999999))), 3, 12); session('_MDPHP_HASH_'.$id.'_', $hash); return $hash; } /** * 验证表单Hash值 * @return boolean 是否正确 */ function hash_check($hash, $id=0){ $hash = ($hash == session('_MDPHP_HASH_'.$id.'_')); session('_MDPHP_HASH_'.$id.'_', null); return $hash; } /** * 获取文件后缀 * @param string $name 文件名 * @return string */ function getFileExt($name){ return pathinfo($name, PATHINFO_EXTENSION); } /** * 获取文件名称 * @param string $name 文件名 * @return string */ function getFileName($name){ return pathinfo($name, PATHINFO_BASENAME); } /** * HTML代码压缩 * @param string $source 源码 * @return string 压缩后的源码 */ function compress_html($source){ $chunks = preg_split('/(<pre.*?\/pre>)/ms', $source, -1, PREG_SPLIT_DELIM_CAPTURE); $source = ''; foreach($chunks as $c){ if(strpos($c, '<pre') !== 0){ $c = preg_replace('/[\\n\\r\\t]+/', ' ', $c); $c = preg_replace('/\\s{2,}/', ' ', $c); $c = preg_replace('/>\\s</', '><', $c); $c = preg_replace('/\\/\\*.*?\\*\\//i', '', $c); } $source .= $c; } return $source; } /** * GZIP压缩 * @param string $data 数据 * @param integer $level 压缩等级(0-9) * @return string 压缩后的数据 */ function ob_gzip($data, $level=0){ $level = ($level<1 ? C('COMPRESS.LEVEL') : $level); if(!headers_sent() && extension_loaded('zlib') && strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')){ $data = gzencode($data, $level); header('Content-Encoding: gzip'); header('Vary: Accept-Encoding'); header('Content-Length: '.strlen($data)); } return $data; } /** * 检测IP地址是否正确 * @param string $str * @return boolean */ function is_ip($str){ $ip = explode('.', $str); for($i=0; $i<count($ip); $i++){ if($ip[$i] > 255) return false; } return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $str); } /** * 检测URL是否正确 * @param string $value * @param integer $option * 0.要求 URL 包含主机名(http://www.example.com) * 1.要求 URL 存在查询字符串(比如:eg.php?age=37) * 2.要求 URL 是 RFC 兼容 URL。(比如:http://example) * 3.要求 URL 在主机名后存在路径(比如:eg.com/example1/) * @return boolean */ function is_url($value, $option=0){ $array = array(FILTER_FLAG_HOST_REQUIRED, FILTER_FLAG_QUERY_REQUIRED, FILTER_FLAG_SCHEME_REQUIRED, FILTER_FLAG_PATH_REQUIRED); return filter_var($value, FILTER_VALIDATE_URL, $array[$option]) != false; } /** * 检测邮箱是否正确 * @param string $value 值 * @return boolean */ function is_email($value){ return filter_var($value, FILTER_VALIDATE_EMAIL) != false; } /** * 容量单位转换 * @param integer $size 容量大小 * @param string $unit 容量计算单位,默认为字节 * @param integer $decimals 小数点后保留的位数,默认保留二位 * @param string $targetUnit 转换的目标单位,默认自动进位 * @return string 返回符合要求的带单位结果 */ function fileSizeConv($size, $unit='B', $decimals=2, $targetUnit='auto'){ $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'); //判断初始单位 $theUnit = array_search(strtoupper($unit), $units); //判断自动计算 if ($targetUnit != 'auto') $targetUnit = array_search(strtoupper($targetUnit), $units); //分流计算 if($theUnit > $targetUnit){ //单位: 大 -> 小 $size = $size * pow(1024, $theUnit - $targetUnit); }elseif($theUnit < $targetUnit){ //单位: 小 -> 大 $size = $size / pow(1024, $targetUnit - $theUnit); }else{ //单位: 自动(小到大) $targetUnit = $theUnit; while($size >= 1024){ $size/=1024; $targetUnit++; } } return sprintf("%1\$.{$decimals}f", $size) . $units[$targetUnit]; } /** * MD5安全版 * @param string $data 数据 * @return string 加密后的数据 */ function md6($data){ return md5(crypt($data, md5(base64_encode($data . strlen($data))))); } /** * Crypt加密 * @param string $data 数据 * @return string 加密后的数据 */ function crypt_encode($data, $key){ $key = md6($key); $x = 0; $len = strlen($data); $l = strlen($key); $char = ''; for($i=0; $i<$len; $i++){ if($x == $l) $x = 0; $char .= $key{$x}; $x++; } $str = ''; for($i=0; $i<$len; $i++){ $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); } return base64_encode($str); } /** * Crypt解密 * @param string $data 数据 * @return string 解密后的数据 */ function crypt_decode($data, $key){ $key = md6($key); $x = 0; $data = base64_decode($data); $len = strlen($data); $l = strlen($key); $char = ''; for($i=0; $i<$len; $i++){ if($x == $l) $x = 0; $char .= substr($key, $x, 1); $x++; } $str = ''; for($i=0; $i<$len; $i++){ if(ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))){ $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); }else{ $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); } } return $str; } /** * 检测提交参数是否正确 * @param array $group 参数组 * @param string $value 不允许字符 * @return string 是否正确 */ function check_param($group, $value=''){ if(is_array($group)){ foreach($group as $v){ if($v === $value) return false; } return true; }else{ return $group !== $value; } } /** * 终止提示 */ function halt($e){ if(!constant('APP_DEBUG')) error('系统出错, 请稍后访问.'); if(!is_array($e)){ $trace = debug_backtrace(); $e['message'] = $e; $e['title'] = '程序错误'; $e['file'] = $trace[0]['file']; $e['line'] = $trace[0]['line']; $e['class'] = isset($trace[0]['class']) ? $trace[0]['class'] : ''; $e['function'] = isset($trace[0]['function']) ? $trace[0]['function'] : ''; } ob_start(); debug_print_backtrace(); $e['trace'] = nl2br(htmlspecialchars(ob_get_clean())); include MD_ROOT.'Library/Default/halt'; exit; } /** * 提示错误 */ function error(){ $args = func_get_args(0); $language = C('Language'); switch(count($args)){ case 1: $content = $args[0]; break; case 2: if(array_key_exists($args[0], $language)){ $content = sprintf($language[$args[0]], $args[1]); }else{ $title=$args[0]; $content=$args[1]; } break; default: $title = $args[1]; if(array_key_exists($args[0], $language)){ $content = $language[$args[0]]; array_splice($args, 0, 2, $content); $content = call_user_func_array('sprintf', $args); } break; } $title = empty($title) ? '程序错误' : $title; include MD_ROOT.'Library/Default/error'; exit; } /** * 小提示 * @param array $mess 提示内容 * @param string $url 跳转地址(为空后退) * @param integer $time 等待跳转时间(秒) */ function alert($mess, $url=null, $time=3){ if($url===true) $url=$_SERVER['HTTP_REFERER']; $time *= 1000; str_replace('"', '\"', $url); $mess = htmlspecialchars($mess); include MD_ROOT.'Library/Default/alert'; exit; } /** * 获取随机文件名 * @param string $ext 文件后缀名, 如".png" * @return string 文件名 */ function getRandName($ext=''){ return md5(date('YmdHis').uniqid(true, true).mt_rand()) . $ext; } /** * 数组回调 * @param array $data 一个数组 * @param callback $callback 回调函数 * @param [type] $args 额外参数(第三项) * @param [type] $index 内部指针, 不要传参 * @return array 处理后数组 */ function arrayCallBack($data, $callback, $args=null, $index=null){ if(is_array($data)){ foreach($data as $key => $value){ $data[$key] = arrayCallBack($value, $callback, $args, $key); } }else{ $data = call_user_func($callback, $data, $index, $args); } return $data; } /** * json编码(支持GBK) * @param [type] $value 值 * @return string json */ function jsonEncode($value){ if(PHP_VERSION < 5.4) return json_encode(array_map('setEncoding', $value)); else return json_encode($value, JSON_UNESCAPED_UNICODE); } /** * json解码(支持GBK) * @param string $json json * @param boolean $assoc 返回方式(true: array, false: object) * @return array 结果 */ function jsonDecode($json, $assoc=false){ return json_decode(setEncoding($json), $assoc); } /** * 将字符串设置为指定编码 * @param string $str 字符串 * @param string $out 编码类型 * @return string 结果 */ function setEncoding($str, $out='UTF-8'){ if(is_numeric($str)) return $str; return mb_convert_encoding($str, $out, array('UTF-8', 'ASCII', 'GBK', 'GB2312', 'Unicode', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16', 'Windows-1251', 'Windows-1252', 'Windows-1254', 'JIS', 'EUC-JP', 'EUCJP-WIN', 'SJIS-WIN')); } /** * Unicode编码 * @param string $value 值 * @return string 结果 */ function unicodeEncode($value){ return str_replace('\"', '"', trim(jsonEncode($value), '"')); } /** * Unicode解码 * @param string $value 值 * @return string 结果 */ function unicodeDecode($value){ $object = jsonDecode('{"str":"' . str_replace('"', '\"', $value) . '"}'); return $object->str; } /** * 获取客户端IP地址 * @return string */ function getIP(){ $local = '127.0.0.1'; if(!empty($_SERVER['HTTP_CLIENT_IP'])){ return is_ip($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : $local; }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ return is_ip($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $local; }else{ return is_ip($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : $local; } } /** * Ajax信息反馈 * @param array $data 返回信息 */ function ajaxReturn($data){ if(!headers_sent()) header('Content-type: application/json; charset=' . C('DOC_CHARSET')); echo jsonEncode($data); exit; } /** * 删除字符串左边指定内容 * @param string $str 字符串 * @param string $value 欲删除内容 * @param boolean $str 绝对删除 * @return string */ function trim_left($str, $value=' ', $absolute=false){ if($absolute && ($str==$value)) return $str; if(substr($str, 0, $l=strlen($value)) == $value) return substr($str, $l); else return $str; } /** * 删除字符串右边指定内容 * @param string $str 字符串 * @param string $value 欲删除内容 * @param boolean $str 绝对删除 * @return string */ function trim_right($str, $value=' ', $absolute=false){ if($absolute && ($str==$value)) return $str; if(substr($str, -($l=strlen($value))) == $value) return substr($str, 0, -$l); else return $str; } /** * 获取根目录地址 * @return string */ function getRootPath(){ $str = str_repeat('../', count(explode('/', MD_PATH_INFO)) + define('MD_BOOT_FILE') - 1); return ($str ? $str : './'); } /** * in_array 不区分大小写 * @param string $value 比较值 * @param array $array 查找值组 * @return boolean */ function in_array_case($value, $array){ return in_array(strtolower($value), array_map('strtolower', (array)$array)); } /** * curl模拟提交 * @param string $url 网址 * @param array/string $opt 提交参数 * @param string &$header 取回的头信息 * @return string 取回的网页数据 * @return boolean 是否重定向 * @return boolean https验证证书 */ function curl($url, $opt='GET', &$header=null, $redirect=true, $ssl=false){ //初始化 $ch = curl_init($url); //配置设置 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $ssl); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $redirect); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); #返回结果 curl_setopt($ch, CURLOPT_HEADER, true); #显示协议头 if(is_array($opt)){ //转小写 $opt = array_change_key_case($opt, CASE_LOWER); //POST if(isset($opt['type']) && strtoupper($opt['type'])=='POST'){ curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, (isset($opt['data']) ? $opt['data'] : '')); } //User-Agent if(array_key_exists('ua', $opt)) curl_setopt($ch, CURLOPT_USERAGENT, $opt['ua']); //Header if(array_key_exists('header', $opt)){ curl_setopt($ch, CURLOPT_HTTPHEADER, (array)$opt['header']); } //Cookie if(array_key_exists('cookie', $opt)) curl_setopt($ch, CURLOPT_COOKIE, $opt['cookie']); //Referer if(array_key_exists('referer', $opt)) curl_setopt($ch, CURLOPT_REFERER, $opt['referer']); }else{ //仅POST if(strtoupper((string)$opt) == 'POST') curl_setopt($ch, CURLOPT_POST, true); } $result = curl_exec($ch); if(curl_errno($ch)){ $result = curl_error($ch); }else{ //获取头长度 $length = curl_getinfo($ch, CURLINFO_HEADER_SIZE); //取出头信息 $header = substr($result, 0, $length); //去掉头信息 $result = substr($result, $length); } //释放 curl_close($ch); return $result; } /** * 递归创建目录 * @param string $dirName 目录 * @param int $auth 权限 * @return bool */ function createDir($path, $auth=0777){ $path = rtrim(str_replace('\\', '/', $path), '/'); if(is_dir($path)) return true; $dir = explode('/', $path); $i = 0; $str = ''; foreach ($dir as $value){ $str .= $value . '/'; is_dir($str) || (@mkdir($str, $auth, true) && ++$i); } return $i ? $i : is_dir($path); }